home *** CD-ROM | disk | FTP | other *** search
- /*
- * Visual Basic Callback Server Source
- *
- * (c) Copyright Microsoft Corp. 1995 All Rights Reserved
- */
-
- #include "hostenv.h"
- #include "svrmain.h"
- #include "CBackGen.h"
-
- CCBGenerator FAR* CCBGenerator::Create(void)
- {
- CCBGenerator FAR* pobj = NULL;
- pobj = new CCBGenerator();
- if (pobj != NULL)
- pobj->AddRef();
- return pobj;
- }
-
- CCBGenerator::CCBGenerator()
- {
- m_pIID = &IID__CallBackGenerator;
- }
- CCBGenerator::~CCBGenerator()
- {
- }
- STDMETHODIMP
- CCBGenerator::get_NewCallBack(THIS_ VBCallBackType Type, VARIANT VBHandler, VARIANT Contained, CCallBack FAR* FAR* retVal)
- {
- HRESULT hr = NOERROR;
- *retVal = NULL;
- IDispatch FAR* pdispVBHandler;
- VARIANT_BOOL bContained;
- //Coerce the VBHandler optional parameter.
- if (VBHandler.vt == VT_ERROR && VBHandler.lVal == DISP_E_PARAMNOTFOUND)
- pdispVBHandler = NULL;
- else if SUCCEEDED(VariantChangeType(&VBHandler, &VBHandler, VARIANT_NOVALUEPROP, VT_DISPATCH))
- pdispVBHandler = VBHandler.pdispVal;
- else
- return ResultFromScode(DISP_E_TYPEMISMATCH);
- //Coerce the Contained optional parameter
- if (Contained.vt == VT_ERROR && Contained.lVal == DISP_E_PARAMNOTFOUND)
- bContained = FALSE;
- else if SUCCEEDED(VariantChangeType(&Contained, &Contained, 0, VT_BOOL))
- bContained = Contained.bool;
- else
- return ResultFromScode(DISP_E_TYPEMISMATCH);
-
- switch (Type)
- {
- #define CB_DO_CREATE
- #include "CBackDat.h"
- #undef CB_DO_CREATE
- default:
- hr = ResultFromScode(E_FAIL);
- }
- if (*retVal)
- {
- if (pdispVBHandler)
- {
- (*retVal)->m_pVBClass = pdispVBHandler;
- if (bContained)
- (*retVal)->m_bContained = TRUE;
- else
- pdispVBHandler->AddRef();
- }
- (*retVal)->AddRef();
- }
- return hr;
- }
- //---------------------------------------------------------------------
- // The CCBGenerator Class Factory
- //---------------------------------------------------------------------
-
- IClassFactory FAR*
- CCBGeneratorCF::Create()
- {
- CCBGeneratorCF FAR* pCF;
-
- pCF = new FAR CCBGeneratorCF();
- if(pCF == NULL)
- return NULL;
- pCF->AddRef();
- return pCF;
- }
- CCBGeneratorCF::CCBGeneratorCF()
- {
- m_refs = 0;
- g_cObj++;
- }
- CCBGeneratorCF::~CCBGeneratorCF()
- {
- g_cObj--;
- }
- STDMETHODIMP
- CCBGeneratorCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
- {
- if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
- {
- *ppv = this;
- }
- else
- {
- *ppv = NULL;
- return ResultFromScode(E_NOINTERFACE);
- }
- AddRef();
- return NOERROR;
- }
-
- STDMETHODIMP_(ULONG)
- CCBGeneratorCF::AddRef(void)
- {
- return ++m_refs;
- }
-
-
- STDMETHODIMP_(ULONG)
- CCBGeneratorCF::Release(void)
- {
- if(--m_refs == 0)
- {
- delete this;
- return 0;
- }
- return m_refs;
- }
-
- STDMETHODIMP
- CCBGeneratorCF::CreateInstance(IUnknown FAR* pUnkOuter, REFIID riid, void FAR* FAR* ppv)
- {
- IUnknown FAR *pcdt = NULL;
- HRESULT hr;
-
- //No aggregation
- if (pUnkOuter || !IIDOK(IUnknown) )
- return ResultFromScode(CLASS_E_NOAGGREGATION);
-
- pcdt = CCBGenerator::Create();
- if(pcdt == NULL)
- {
- *ppv = NULL;
- return ResultFromScode(E_FAIL);
- }
- hr = pcdt->QueryInterface(riid, ppv);
- pcdt->Release();
- return hr;
- }
-
-
- STDMETHODIMP
- CCBGeneratorCF::LockServer(BOOL fLock)
- {
- extern ULONG g_cLock;
- fLock ? g_cLock++ : g_cLock--;
- return NOERROR;
- }
-
-